package Util;

import Util.HttpUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

import static Util.UrlCollect.*;
import static Util.WordExtractFootnote.wordExtractFootnote;

/*
指标对象相关操作
 */

public class Indicator {
    //指标对象名称
    public static String name = null;

    static HttpUtil httpUtil = new HttpUtil();
    /**
     根据模板Id获取模板信息
     */
    public static JSONObject getMuBan(String id){
        //url:获取模版信息 Post请求
        String url = OBTAIN_OUTLINE_URL;
        Map<String, String> maps =new HashMap<>();
        maps.put("id",id);
        return JSONObject.parseObject(httpUtil.doParamsPost(url,maps));
    }

    /**
     根据大纲Id获取模板信息
     */
    public static JSONObject getDetail(String key) throws IOException {
        //url:获取模版详细信息 Post请求
        String url = GET_DETAILS_URL;
        return  httpUtil.doBodyPost(url, "{\"id\":" + key + "}");
    }


    /**
     根据模版名称获取模版Id
     */
    public static String  getMuBanId() throws IOException {
        String ids = null;
        String url = GET_ALL_TEMPLATES_URL;
        String param = "{\n" +
                "  \"pageNum\": 1,\n" +
                "  \"pageCount\": 20,\n" +
                "  \"name\": \""+name+"\"\n" +
                "}";
        //因为根据模板名称进行查询 只能得到一个数据 所以直接返回字符串而不是字符串数组
        for (Object o : httpUtil.doBodyPost(url, param).getJSONObject("data").getJSONArray("data")) {
            JSONObject o1 = (JSONObject) o;
            ids = o1.getString("id");
        }

        return ids;
    }

    /**
     根据outlineId将对应指标对象置空
     */
    public static JSONObject setBlank(String s) throws IOException {
        //url:将对应指标对象置空 Post请求
        String url = MODIFY_INDICATOR_OBJECT_URL;
        String param = "{" +
                "\"data\": [{\"unknownId\": 0, \"type\": \"UNKNOWN_INDICATOR_OBJECT\"}],"+
                "\"outlineId\":"+ s +"}";
        return httpUtil.doBodyPost(url, param);
    }


    /**
     根据模板Id将其中的相应指标对象置空
     内容即content 将大纲名称中包含content的对应的指标对象置空
     */
    public static void setIndicatorBlank(String id,String content) throws IOException {
        JSONObject jsonObject = getMuBan(id);
        JSONArray jsonArray = jsonObject.getJSONArray("data");

        for(Object o:jsonArray){
            JSONObject js = (JSONObject) o;
            String key = js.getString("key");

            JSONObject jsonObject1 = getDetail(key);
            JSONArray jsonArray1 = jsonObject1.getJSONArray("data");

            for(Object o1:jsonArray1){
                JSONObject jsonObject2 = (JSONObject) o1;
                //判断如果大纲名称包括000 即调用置空指标对象方法 将其置空
                if(jsonObject2.getString("titleFootnote")!=null&&jsonObject2.getString("titleFootnote").contains(content)){
                    String s = jsonObject2.getString("outlineId");
                    System.out.println(setBlank(s));
                }
            }

        }
    }

    /**
     根据模板Id将其中的正文背景置空
     */
    public static void setTextBackground(String id) throws IOException {
        //得到模板信息
        JSONObject jsonObject = getMuBan(id);
        JSONArray jsonArray = jsonObject.getJSONArray("data");
        for(Object o:jsonArray){
            JSONObject js = (JSONObject) o;
            String key = js.getString("key");
            //根据大纲Id得到详细的信息
            JSONObject jsonObject1 = getDetail(key);
            JSONArray jsonArray1 = jsonObject1.getJSONArray("data");
            for(Object o1:jsonArray1){
                JSONObject jsonObject2 = (JSONObject) o1;
                JSONArray jsonArray2 = jsonObject2.getJSONArray("data");
                for(Object o2:jsonArray2){
                    JSONObject jsonObject3 = (JSONObject) o2;
                    String s=jsonObject3.getString("interpretationContent");
                    if(s !=null&&s.contains(" background-color: rgb(255, 255, 255);")){
                        String s1 = jsonObject3.getString("interpretationId");
                        String deletedStr = s.replace(" background-color: rgb(255, 255, 255);", "").replace("\"","\\\"");
                        String param =  "{\"interpretationId\":"+s1+" ," + " \"contentFootnote\": \""+deletedStr+"\"}";
                        //url:将正文对应的指标

                        System.out.println(httpUtil.doBodyPost(MODIFY_MAIN_TEXT_URL, param));
                    }
                }

            }

        }
    }

    /**
     * 提取word脚注保存txt
     */
    public static void listFilesForFolder(String mPath,String savePath) throws IOException {
        for (final File fileEntry : Objects.requireNonNull(new File(mPath).listFiles())) {
            String fileName = fileEntry.getName();
            if (fileEntry.getName().contains("~$")) {
                continue;
            }
            System.out.println(fileEntry.getName());
            wordExtractFootnote(mPath+ fileName,savePath + fileName.replace("doc", "txt"));
        }
    }

    /**
     读取文件夹 给相应的指标对象 加入脚注：
     文件以模板名称命名，内容形式为：指标对象名 脚注内容
     */
    public static void readFiles(File folder) throws IOException {
        File[] files = folder.listFiles();
//        判断文件夹是否为空
        if (files != null) {
//            遍历文件夹中的文件
            for (File file : files) {
//                递归遍历 若对应file是文件夹 则递归遍历
                if (file.isDirectory()) {
                    readFiles(file);
//                若不是则判断其是否为txt文件
                } else if (file.isFile() && file.getName().endsWith(".txt")) {
                    int i=0;
//                    获取文件名（即模板名称）
                    name = file.getName().replace(".txt", "");

//                    读取文件中的信息 将其放入HashMap中
                    for (int j = 0; j < 2; j++) {
                        if (j==1){
                            name = name+"（一年版）";
                        }
                        System.out.println(name);
                        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
                            String line;
                            HashMap<String,String> foots = new HashMap<>();
                            boolean flag = name.contains("一年版");
                            while ((line = reader.readLine()) != null) {
                                String[] s = line.split(" ");
                                String s1;
//                            一年版
                                if(flag && s[0].contains("（两届合并）")){
                                    s1 = s[0].replace("（两届合并）","");
                                }else {
//                            多年版
                                    s1=s[0];
                                }
                                String explanation = s[1];
//                            将脚注和其对应的名称放入hashMao中
                                foots.put(s1,explanation);
                            }
//                        得到模板ID
                            String muBanId = getMuBanId();
//                        根据模板Id得到模板
                            JSONObject jsonObject = getMuBan(muBanId);
                            JSONArray jsonArray = jsonObject.getJSONArray("data");
                            for(Object o:jsonArray){
                                JSONObject js = (JSONObject) o;
//                            根据大纲Id得到详细的信息
                                JSONObject jsonObject1 = getDetail(js.getString("key"));
                                JSONArray jsonArray1 = jsonObject1.getJSONArray("data");
                                for(Object o1:jsonArray1){
                                    JSONObject jsonObject2 = (JSONObject) o1;
                                    String indicatorObjectId =null;
//                                判断该指标对象是否存在于hashMap中
                                    if(foots.containsKey(jsonObject2.getString("titleFootnote"))){
                                        JSONArray jsonArray2 = jsonObject2.getJSONArray("data");
//                                    获取对应指标对象的Id:以为大纲名称一般与指标对象名称相对应且一个大纲一般对应一个指标对象 所以我们仅需找到一个非空的指标对象Id即可
                                        for (Object object : jsonArray2) {
                                            JSONObject jsonObject3 =(JSONObject) object;
                                            if(jsonObject3.getString("indicatorObjectId")!=null){
                                                indicatorObjectId = jsonObject3.getString("indicatorObjectId");
                                            }
                                        }
//                                    指标对象Id为空则表明指标对象未被创建 不能添加脚注
                                        if (indicatorObjectId!=null){
                                            String params = "{" + "\"indicatorObjectId\": "+Integer.parseInt(indicatorObjectId)+"," +
                                                    "\"id\":\""+muBanId+"\"," +
                                                    "\"annotation\":\"<p>"+foots.get(jsonObject2.getString("titleFootnote"))+"</p>\"" +
                                                    "}";
//                                       System.out.println(jsonObject2.getString("titleFootnote"));
//                                        url:修改指标对象脚注
                                        httpUtil.doBodyPost(MODIFY_FOOTNOTE_URL, params);
                                            System.out.println(params);
                                            i++;
                                        }
                                    }
                                }
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        System.out.println(i+"============");
                    }


                }
            }
        }
    }

    /**
     根据大纲Id和指标Id选取指标对象
     */

    public static JSONObject setIndicatorObject(String indicatorObjectId,String outlineId) throws IOException {
        //url:将对应指标对象置空 Post请求
        String url = ADD_BODY_INDICATOR_OBJECT_URL;
        String param ="{" +
                "\"data\": [{" +
                "\"indicatorObjectId\": "+indicatorObjectId+"," +
                "\"type\": \"UNKNOWN_INDICATOR_OBJECT\"" +
                "}]," +
                "\"outlineId\": " +outlineId+
                "}";
        return httpUtil.doBodyPost(url, param);
    }


}
